Skip to main content

通信

在计算机领域中,“通信”涵盖了从底层进程交互到上层网络协议的多种场景。结合前端开发、浏览器机制和分布式系统等常见场景,以下从多个维度解析通信机制:

一、浏览器与前端通信机制

1. 进程间通信(IPC,Inter-Process Communication)

场景:Chromium架构中主进程与渲染进程、GPU进程之间的通信。
原理:通过消息传递(Message Passing) 机制,避免共享内存带来的安全风险。
Chromium实现

  • 使用IPC::Channel建立双向通道,基于MessagePumpMessageLoop处理异步消息。
  • 消息被序列化为二进制数据,通过管道(Pipe)或套接字(Socket)传输。
    示例:主进程向渲染进程发送“加载URL”指令,渲染进程返回“页面加载完成”事件。

2. 页面间通信(同一浏览器内)

(1)postMessage(跨域安全通信)

原理:通过window.postMessage(data, targetOrigin)向其他窗口发送消息,接收方通过message事件监听。
示例

// 发送方(父窗口)
const iframe = document.getElementById('myIframe');
iframe.contentWindow.postMessage('Hello from parent', 'https://target-domain.com');

// 接收方(iframe页面)
window.addEventListener('message', (event) => {
if (event.origin === 'https://sender-domain.com') {
console.log('Received:', event.data);
}
});

安全提示:必须验证event.origin,避免恶意域名攻击。

(2)BroadcastChannel(广播通信)

原理:创建频道,同一域名下的所有窗口可订阅同一频道并接收消息。

// 窗口A
const channel = new BroadcastChannel('my-channel');
channel.postMessage('News update!');

// 窗口B
const channel = new BroadcastChannel('my-channel');
channel.onmessage = (event) => console.log(event.data);
(3)本地存储事件(storage事件)

原理:监听localStoragesessionStorage的变化,实现页面间通信。

// 监听方
window.addEventListener('storage', (event) => {
if (event.key === 'userData') {
console.log('Data updated:', event.newValue);
}
});

// 发送方
localStorage.setItem('userData', JSON.stringify({ id: 123 }));

3. 前端与后端通信(网络层)

(1)HTTP/HTTPS(RESTful API)

原理:基于请求-响应模式,通过fetchXMLHttpRequest发送请求。
示例

fetch('https://api.example.com/data', {
method: 'GET',
headers: { 'Content-Type': 'application/json' }
})
.then(res => res.json())
.then(data => console.log(data));
(2)WebSocket(双向实时通信)

原理:建立持久化连接,支持服务器主动推送消息(不受同源策略限制)。

const socket = new WebSocket('wss://echo.websocket.org');

socket.onopen = () => socket.send('Hello!');
socket.onmessage = (event) => console.log('Received:', event.data);
socket.onclose = () => console.log('Connection closed');
(3)Server-Sent Events(SSE,单向服务器推送)

原理:服务器向客户端推送事件流,客户端通过EventSource接收。

const source = new EventSource('https://api.example.com/events');

source.onmessage = (event) => {
const data = JSON.parse(event.data);
console.log('Event:', data.type, data.payload);
};

source.onerror = (error) => console.error('SSE error', error);

二、后端与分布式系统通信

1. 微服务通信模式

(1)RESTful API(基于HTTP)

特点:轻量级、跨语言,适合松耦合服务。
示例:服务A通过HTTP请求调用服务B的API:

# 服务A(Python)
import requests
response = requests.get('http://service-b/api/products/123')
data = response.json()
(2)RPC(远程过程调用)

原理:模拟本地函数调用,隐藏网络通信细节。
框架

  • gRPC(基于HTTP/2,支持流式通信):
# gRPC客户端
import grpc
import product_pb2, product_pb2_grpc

channel = grpc.insecure_channel('service-b:50051')
stub = product_pb2_grpc.ProductServiceStub(channel)
response = stub.GetProduct(product_pb2.ProductRequest(id=123))
print(response.name)
  • Dubbo(Java生态,支持服务注册与发现)。
(3)消息队列(MQ,异步通信)

场景:解耦服务,处理高并发任务(如订单系统与库存系统)。
中间件

  • Kafka(高吞吐量,适合日志流处理):
from kafka import KafkaProducer

producer = KafkaProducer(bootstrap_servers=['kafka:9092'])
producer.send('order-topic', key=b'123', value=b'{"id":123, "status":"created"}')
  • RabbitMQ(支持复杂路由,如发布-订阅模式)。

2. 进程内通信(同进程不同模块)

方式:函数调用、回调函数、事件发布-订阅(如Node.js的EventEmitter)。

// Node.js事件订阅示例
const EventEmitter = require('events');
const emitter = new EventEmitter();

emitter.on('user registered', (user) => {
console.log(`User ${user.name} registered, sending welcome email...`);
});

emitter.emit('user registered', { name: 'Alice', email: 'alice@example.com' });

三、跨设备与物联网通信

1. MQTT(轻量级消息协议)

场景:低带宽、高延迟场景(如智能家居、传感器网络)。
特点:基于发布-订阅模式,支持QoS(服务质量)等级。

import paho.mqtt.client as mqtt

def on_message(client, userdata, msg):
print(f"Topic: {msg.topic}, Payload: {msg.payload.decode()}")

client = mqtt.Client()
client.on_message = on_message
client.connect("mqtt-broker.com", 1883, 60)
client.subscribe("home/sensors/temp")
client.loop_forever()

2. WebSocket IoT扩展

场景:实时监控设备状态(如智能电表、工业设备)。
优势:双向通信,减少连接开销。

四、通信安全与性能优化

1. 安全层面

  • 加密传输:HTTPS(TLS/SSL)、WebSocket over TLS(wss)。
  • 身份认证:JWT、OAuth 2.0、TLS双向认证(客户端证书)。
  • 防篡改:消息签名(如HMAC)、数据加密(AES)。

2. 性能优化

  • 减少通信次数:批量请求(如GraphQL)、合并资源。
  • 压缩数据:HTTP压缩(gzip)、Protobuf序列化(比JSON更小)。
  • 连接复用:HTTP/2多路复用、WebSocket持久连接。

五、通信机制对比与选型

场景推荐机制优势限制
前端页面间跨域通信postMessage跨域安全、API简洁需手动处理消息监听
实时聊天、直播WebSocket双向实时、低延迟服务器资源消耗较高
后端微服务松耦合通信消息队列(Kafka/RabbitMQ)异步解耦、支持高并发数据一致性需额外处理
高性能RPC调用gRPC基于HTTP/2、流式通信、跨语言支持依赖服务发现机制
低带宽物联网设备MQTT轻量级、支持离线消息不适用于复杂业务逻辑

六、总结:通信的核心要素

  1. 模式选择:根据实时性(WebSocket)、解耦需求(消息队列)、跨域场景(postMessage)选择合适机制。
  2. 安全优先:所有网络通信需加密,避免明文传输敏感数据。
  3. 性能平衡:HTTP/2适合API请求,WebSocket适合实时场景,避免过度设计。
  4. 跨平台兼容:前端通信需考虑浏览器兼容性(如WebSocket在旧浏览器的polyfill)。

理解不同通信机制的原理与适用场景,能帮助开发者在架构设计中做出更优选择。